#include "stm32f10x.h"                  // Device header

void Adc_Init(void)
{
	//开启外设时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
	
	/*开启GPIO的时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);			//开启GPIOA的时钟
	
	//开启ADC的RCC分频
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);								//开启六分频，就是12MHz，ADC最高的分频就是14MHz的，要比这个小
	
	/*不在此处配置规则组序列，而是在每次AD转换前配置，这样可以灵活更改AD转换的通道*/
	
	//ADC初始化
	ADC_InitTypeDef ADC_InitStruct;
	ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;				//ADC_ContinuousConvMode是ADC的连续模式，DISABLE或者ENABLE
	ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;				//ADC_DataAlign是ADC的数据是左对齐ADC_DataAlign_Left，还是右对齐ADC_DataAlign_Right
	ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//ADC_ExternalTrigConv是定义外部触发的来源，这里选择软件触发，所以用ADC_ExternalTrigConv_None不需要外部触发来源
	ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;					//ADC_Mode是ADC的模式，是选择双ADC模式还是单ADC模式，这里用单模式，所以用ADC_Mode_Independent
	ADC_InitStruct.ADC_NbrOfChannel = 1;							//ADC_NbrOfChannel是ADC的数据通道来源，是从哪里来的数据
	ADC_InitStruct.ADC_ScanConvMode = DISABLE;						//ADC的扫描模式，是DISABLE或者ENABLE
	ADC_Init(ADC1,&ADC_InitStruct);
	
	/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;					//GPIO时钟的模式需要选择AIN，也就是我们的模拟输入模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);							//将PA1和PA2引脚初始化为推挽输出
	
	//ADC使能
	ADC_Cmd(ADC1,ENABLE);
	
	//ADC校准
	ADC_ResetCalibration(ADC1);										//重新设置ADC1的校准
	while(ADC_GetResetCalibrationStatus(ADC1) == SET);				//当ADC重新设置ADC1的校准后，他会自动清0，所以这里用一个while判断一下，如果获取到校准的标志位还是1，就表示还没有校准完成，如果是校准完成就是0
	ADC_StartCalibration(ADC1);										//设置校准
	while(ADC_GetCalibrationStatus(ADC1) == SET);					//当ADC完成校准后，他会自动清0，所以这里用一个while判断一下，如果获取到校准的标志位还是1，就表示还没有校准完成，如果是校准完成就是0
}

uint16_t Adc_GetData(uint8_t ADC_Channel_Data)
{
	//在这里配置通道
	ADC_RegularChannelConfig(ADC1,ADC_Channel_Data,1,ADC_SampleTime_55Cycles5);//开启ADC的通道，选择ADC1、通道0（GPIO_A0）、1序列，采样时间选择ADC_SampleTime_55Cycles5，55的
	
	ADC_SoftwareStartConvCmd(ADC1,ENABLE);							//因为前面没有选择外部触发，所以这个地方需要软件触发，然后软件触发之后，数据才会被转化
	while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC) == RESET);			//ADC_GetFlagStatus是获取软件触发标志位，就是看软件触发之后，转换完成没有
	return ADC_GetConversionValue(ADC1);							//把ADC转化的值，直接返回回去
}
